﻿/*************************************************************************************
 * 工    具：  HK_Button
 * 
 * 描    述：  重写的UGUI Button组件，通过在Inspector面板中修改AudioType播放对应的Button音效
 * 
 * 版    本：  V1.1
 * 作    者：  京产肠饭、谭潇杰、周阿媛
 * 
 * 创    建：  2021/09/02  V1.0
 * 
 * 更    新：  2022/10/07  V1.1
 *            加入几组交互动画（使用Dotween）,切换AnimType即可使用对应的交互动画
 *            
 * 链    接：  https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using System;
using UnityEngine.EventSystems;
using DG.Tweening;

namespace UnityEngine.UI
{
    //物体身上带有的组件
    [RequireComponent(typeof(Image))]
    [AddComponentMenu("UI/HK_Button", 30)]
    public class HK_Button : Button
    {
        public enum AudioType
        {
            Default,
            Type1,
            Type2,
            Type3,
            Type4
        }

        [SerializeField]
        AudioType audioType = AudioType.Default;

        #region 事件类型
        public static event Action defaultAudio_Event;
        public static event Action type1Audio_Event;
        public static event Action type2Audio_Event;
        public static event Action type3Audio_Event;
        public static event Action type4Audio_Event;
        #endregion

        public enum AnimationType
        {
            None,
            Anim01,
            Anim02,
        }

        [SerializeField]
        AnimationType animType = AnimationType.None;

        Vector3 initScale = Vector3.one;

        protected override void Awake()
        {
            base.Awake();
            initScale = transform.localScale;
        }

        //重写系统自带的点击方法：添加点击音效方法
        public override void OnPointerClick(PointerEventData eventData)
        {
            base.OnPointerClick(eventData);
            PlayAudio(audioType);
        }

        //重写系统自带的点击确认方法：添加点击音效方法
        public override void OnSubmit(BaseEventData eventData)
        {
            base.OnSubmit(eventData);
            PlayAudio(audioType);
        }

        public override void OnPointerEnter(PointerEventData eventData)
        {
            base.OnPointerEnter(eventData);
            PlayMouseEnterAnim();
        }

        public override void OnPointerExit(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);
            PlayMouseExitAnim();
        }

        // 播放鼠标移入时的动画
        void PlayMouseEnterAnim()
        {
            switch (animType)
            {
                case AnimationType.None:
                    break;
                case AnimationType.Anim01:
                    transform.DOScale(initScale * 1.05f, 0.15f);
                    break;
                case AnimationType.Anim02:
                    transform.DOScale(initScale * 1.12f, 0.55f).SetEase(Ease.OutBounce);
                    break;
                default:
                    break;
            }
        }

        // 播放鼠标移出时的动画
        void PlayMouseExitAnim()
        {
            switch (animType)
            {
                case AnimationType.None:
                    break;
                case AnimationType.Anim01:
                    transform.DOScale(initScale, 0.15f);
                    break;
                case AnimationType.Anim02:
                    transform.DOScale(initScale, 0.5f).SetEase(Ease.OutBounce);
                    break;
                default:
                    break;
            }
        }

        // 播放点击时的音效
        void PlayAudio(AudioType audioType)
        {
            UISystemProfilerApi.AddMarker("Button.onClick", this);

            switch (audioType)
            {
                case AudioType.Default:
                    if (defaultAudio_Event != null)
                        defaultAudio_Event();
                    break;
                case AudioType.Type1:
                    if (type1Audio_Event != null)
                        type1Audio_Event();
                    break;
                case AudioType.Type2:
                    if (type2Audio_Event != null)
                        type2Audio_Event();
                    break;
                case AudioType.Type3:
                    if (type3Audio_Event != null)
                        type3Audio_Event();
                    break;
                case AudioType.Type4:
                    if (type4Audio_Event != null)
                        type4Audio_Event();
                    break;
            }
        }
    }
}
